/*
 * @Author: scl
 * @Date: 2023-08-26 20:28:40
 * @LastEditTime: 2023-08-27 11:59:50
 * @Description: file content
 */
/*
 * @lc app=leetcode.cn id=40 lang=typescript
 *
 * [40] 组合总和 II
 *
 * https://leetcode.cn/problems/combination-sum-ii/description/
 *
 * algorithms
 * Medium (59.65%)
 * Likes:    1411
 * Dislikes: 0
 * Total Accepted:    448.1K
 * Total Submissions: 751.4K
 * Testcase Example:  '[10,1,2,7,6,1,5]\n8'
 *
 * 给定一个候选人编号的集合 candidates 和一个目标数 target ，找出 candidates 中所有可以使数字和为 target 的组合。
 * 
 * candidates 中的每个数字在每个组合中只能使用 一次 。
 * 
 * 注意：解集不能包含重复的组合。 
 * 
 * 
 * 
 * 示例 1:
 * 
 * 
 * 输入: candidates = [10,1,2,7,6,1,5], target = 8,
 * 输出:
 * [
 * [1,1,6],
 * [1,2,5],
 * [1,7],
 * [2,6]
 * ]
 * 
 * 示例 2:
 * 
 * 
 * 输入: candidates = [2,5,2,1,2], target = 5,
 * 输出:
 * [
 * [1,2,2],
 * [5]
 * ]
 * 
 * 
 * 
 * 提示:
 * 
 * 
 * 1 <= candidates.length <= 100
 * 1 <= candidates[i] <= 50
 * 1 <= target <= 30
 * 
 * 
 */

// @lc code=start
function combinationSum2(candidates: number[], target: number): number[][] {
    const result = [], len = candidates.length, arr = []
    candidates.sort((a,b)=>a-b)
    dfs(target, arr,0);
    function dfs(target, arr,index) {
        if(target<0){
            return
        }
        if(target==0){
            result.push([...arr])
            return
        }
        for (let i = index; i < len; i++) {
            if(arr.length==0&&candidates.indexOf(candidates[i])!=i)continue
            arr.push(candidates[i]);
            dfs(target-candidates[i], arr,i+1);
            const temp=arr.pop();
            while(candidates[i+1]==temp)i++
        }
    }
    return result
};
// @lc code=end

